package godraines.swing;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.SplashScreen;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import java.awt.Rectangle;
import java.awt.Toolkit;

import javax.swing.JDialog;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.UIManager;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class SwingProject extends JFrame {

	// 스윙 기본 시나리오
	// 1. JFrame 크기 지정 : setBounds(x좌표, y좌표, 가로크기, 세로크기)
	// 2. 화면 정중앙에 표시 : 
	// 3. 프로그램 아이콘 추가 : JFrame -> iconImage -> classpath에서 아이콘을 불러온 뒤 적용
	// 4. 프로그램 제목 지정 : 
	// 5. 프레임 크기 변경 불가 : setResizeble
	// 6. splash 화면 표시 : META-INF 폴더에 MANIFEST.MF 파일 작성
	//		- SplashScreen-Image: 항복 추가
	//		- splash 뜨는 시간 지연 : Thread sleep(2000) -> 2초
	// 7. 실행 가능한 jar 파일 생성 (6번과 관련 있음)
	//		- File > Export > Java > JAR file > JavaSwing 모두 선택 ..
	// 8. 메뉴 추가 : 메뉴 추가 순서: JMenuBar -> JMenu -> JMenuItem
	//		- JMenuBar 객체 생성 후 JFrame에 setJMenuBar로 등록
	//		- JMenu 객체 생성 후 JMenuBar에 menuBar.add로 등록
	//		- JMenuItem 객체 생성 후 JMenu에 add로 등록
	// 		- JMenuItem의 setIcon을 이용해서 메뉴 아이콘 등록 (20 x 20 사이즈)
	//		- JMenuItem의 addActionListener를 이용해서 클릭 이벤트(actionPerformd) 추가
	//		- 간단한 대화 상자는 JoptionPane의 show.MessageDialog를 이용
	// 9. 룩앤필 look and feel : GUI 측면과 디자인 형태의 구성에 사용하는 용어
	//		- 색상, 모양, 레이아웃, 서체, 버튼, 박스, 메뉴 등의 동적 요소를 의미
	//		- 자바에서 기본으로 제공하는 룩앤필은 다소 밋밋하기 때문에 교체 특별한 API 제공
	//		- UIManager.setLookAndFeel()
	// 10. 종료 시점 제어 : swing은 이벤트 처리가 핵심 ( event-driven ) 인 GUI 환경
	//		- swing에서 자주 사용하는 이벤트를 ActionListener - actionPerform 임
	//		- 이벤트 메서드를 작성하는 방법 3가지 중 익명 클래스 기법을 자주 사용하지만 가능하다면 독립된 이벤트 처리 클래스를 사용하는 것을 추천함
	//		- 한편, 윈도우 닫기시 이벤트를 걸고 싶으면 WindowListener - WindowClosing을 사용
	//		- 하지만, WindowAdapter를 이용해서 처리하는 것을 추천
	// 11. 이미지 처리 
	//		- JLabel : seticon, 단 이미지 크기가 표시 영역보다 크면 이미지 크기를 줄여야 전체가 다 보임
	//		- JPane : 
	// 12. 모달 창 생성 : 
	//		- Modal 대화상자 : 현재 실행중인 컴포넌트가 입력을 독차지. 뒤에 본체 선택 안됨
	//		- Modaless 대화상자 : 뒤에 본체 선택 됨
	// 13. 대화자 닫기 이벤트 처리 (AboutSwingProject)
	//		- dispose();
	// 14. 대화상자, GroupLayout으로 우편번호 찾기 기능 구현
	
	private JPanel contentPane;
	private static SwingProject frame;																																					// 12
	private static String MetalLook = "javax.swing.plaf.metal.MetalLookAndFeel";
	private static String NimbusLook = "javax.swing.plaf.nimbus.NimbusLookAndFeel";
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Thread.sleep(2000);																																				// 6-2
					
					// 9. 룩앤필 변경 시작 - 프레임 생성전에 해서 프레임에 적용 시킴
					JFrame.setDefaultLookAndFeelDecorated(true);
					// 대화상자도 룩앤필 적용 : 대화상자 - showCOnfirmDialog니까 JDialog
					JDialog.setDefaultLookAndFeelDecorated(true);
					UIManager.setLookAndFeel( MetalLook );
					// 9. 룩앤필 변경 끝
					//SwingProject frame = new SwingProject();																										// 모달창 생성을 위해 부모를 메인 위에 따로 뺌
					frame = new SwingProject();																																// 12
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public SwingProject() {
		setResizable(false);																																							// 5
		setTitle("스윙 프로젝트 v1");																																				// 4
		setIconImage(Toolkit.getDefaultToolkit().getImage(SwingProject.class.getResource("/images/icon/icon.png")));	// 3
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		
		// 10. 윈도우 이벤트 처리 시작
		addWindowListener( new WindowAdapter() {
			
			@Override
			public void windowClosing(WindowEvent e) {
				// 이벤트를 발생할 주체를 알아냄
				JFrame frame = (JFrame) e.getSource();
				// showConfirmDialog : 확인, 취소 버튼으로 이루어진 확인대화상자를 모달창으로 표시
				int result = JOptionPane.showConfirmDialog(frame, "정말 종료하시겠습니까?", "프로그램 종료", JOptionPane.YES_NO_OPTION);
				
				// 대화상자에서 '확인'버튼을 누르면 현재 프레임을 닫음
				if( result == JOptionPane.YES_NO_OPTION) {
					frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );																			// frame. 으로 시작하는 이유는 frame 안에서
				}																																													// 작업이 이루어 지도록 하기 위해서 이다.
			}
		});	// Window Listener
		// 10. 윈도우 이벤트 처리 끝
		
		setBounds(100, 100, 800, 600);																																			// 1
		setLocationRelativeTo(null);																																				// 2
		
		// 8.  메뉴 추가 시작
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnFile = new JMenu("파 일 (F)");
		menuBar.add(mnFile);
		
		JMenuItem miNew = new JMenuItem("새로 만들기 (N)");
		miNew.setIcon(new ImageIcon(SwingProject.class.getResource("/images/menu/new.png")));
		miNew.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "새로 만들기 창이 선택되었습니다.");
			}
		});
		mnFile.add(miNew);
		
		JMenuItem miOpen = new JMenuItem("열 기 (O)");
		mnFile.add(miOpen);
		
		JMenuItem miSave = new JMenuItem("저 장 (S)");
		mnFile.add(miSave);
		
		JSeparator separator = new JSeparator();
		mnFile.add(separator);
		
		JMenuItem miPrint = new JMenuItem("인 쇄 (P)");
		mnFile.add(miPrint);
		
		JSeparator separator_1 = new JSeparator();
		mnFile.add(separator_1);
		
		JMenuItem miExit = new JMenuItem("종 료 (X)");
		miExit.setIcon(new ImageIcon(SwingProject.class.getResource("/images/menu/exit.png")));
		miExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);																																						// 시스템 종료
			}
		});
		mnFile.add(miExit);
		
		JMenu mnEdit = new JMenu("편 집 (E)");
		menuBar.add(mnEdit);
		
		JMenu mnView = new JMenu("보 기 (V)");
		menuBar.add(mnView);
		
		JMenu mnTool = new JMenu("도 구 (T)");
		menuBar.add(mnTool);
		
		JMenu mnWindow = new JMenu("창 (W)");
		menuBar.add(mnWindow);
		
		JMenu mnHelp = new JMenu("도움말(H)");
		menuBar.add(mnHelp);
		
		JMenuItem miAbout = new JMenuItem("스윙 프로젝트에 관하여.. (A)");
		miAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// aboutSwingProject의 main에 있던 애들 잘라서 사용, 스윙 프로젝트 안에서 돌아가게
				aboutSwingProject dialog = new aboutSwingProject( frame );																		// 12
				dialog.setVisible(true);
				
			}
		});
		mnHelp.add(miAbout);
		// 8. 메뉴 추가 끝
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		// 11. JLabel을 이용해서 이미지 표시 시작
		JLabel mainimage = new JLabel("");
		mainimage.setIcon(new ImageIcon(SwingProject.class.getResource("/images/background/cool1b.jpg")));
		// JLabel을 이용해서 이미지 표시 끝
		contentPane.add(mainimage, BorderLayout.CENTER);
	}

}
